home *** CD-ROM | disk | FTP | other *** search
-
- void drawTriangle(unsigned x1,unsigned y1,unsigned x2,unsigned y2,unsigned x3,unsigned y3,unsigned char c)
- {unsigned int bendCheck,slope1,slope2,slope3,z1,first,z2,last,z3,aux,z4;
- unsigned char sign1,sign2,sign3,firstSign,lastSign,auxSign; /* were boolean */
- unsigned char bend;
-
- z1=0; z2=0; z3=0; z4=0; /*note: don't take these out. They're nescessary*/
- /*do a quick little insertion sort on the points*/
- if (y2<y1)
- {asm mov ax,y1
- asm mov bx,y2
- asm mov y1,bx
- asm mov y2,ax
- asm mov ax,x1
- asm mov bx,x2
- asm mov x1,bx
- asm mov x2,ax /*swap point 1 and point 2*/
- }
- if (y3<y2)
- {asm mov ax,y3
- asm mov bx,y2
- asm mov y3,bx
- asm mov y2,ax
- asm mov ax,x3
- asm mov bx,x2
- asm mov x3,bx
- asm mov x2,ax /*swap point 3 and point 2*/
- }
- if (y2<y1)
- {asm mov ax,y1
- asm mov bx,y2
- asm mov y1,bx
- asm mov y2,ax
- asm mov ax,x1
- asm mov bx,x2
- asm mov x1,bx
- asm mov x2,ax /*swap point 1 and point 2*/
- }
-
- /*make sure that no two points have the same y value*/
- if (y1==y2)
- {y2++;
- y3++;
- }
- if (y2==y3) y3++;
-
- /*calculate them slopes, avoiding pascal's meddling with assembly*/
-
- if (x1<x2)
- {asm mov dx,0
- asm mov ax,x2
- asm sub ax,x1
- asm mov ah,al
- asm mov al,0
- asm mov bx,y2
- asm sub bx,y1
- asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
- asm mov slope2,ax
- asm mov byte ptr sign2,0 /*line2 has positive slope*/
- }
- else
- {asm mov dx,0
- asm mov ax,x1
- asm sub ax,x2
- asm mov ah,al
- asm mov al,0
- asm mov bx,y2
- asm sub bx,y1
- asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
- asm mov slope2,ax
- asm mov byte ptr sign2,1 /*line2 has negative slope*/
- }
-
- if (x3<x1)
- {asm mov dx,0
- asm mov ax,x1
- asm sub ax,x3
- asm mov ah,al
- asm mov al,0
- asm mov bx,y3
- asm sub bx,y1
- asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
- asm mov slope1,ax
- asm mov byte ptr sign1,1 /*line1 has negative slope*/
- }
- else
- {asm mov dx,0
- asm mov ax,x3
- asm sub ax,x1
- asm mov ah,al
- asm mov al,0
- asm mov bx,y3
- asm sub bx,y1
- asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
- asm mov slope1,ax
- asm mov byte ptr sign1,0 /*line1 has positive slope*/
- }
-
- if (x3<x2)
- {asm mov dx,0
- asm mov ax,x2
- asm sub ax,x3
- asm mov ah,al
- asm mov al,0
- asm mov bx,y3
- asm sub bx,y2
- asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
- asm mov slope3,ax
- asm mov aux,ax
- asm mov byte ptr sign3,1 /*line3 has negative slope*/
- asm mov byte ptr auxSign,1
- }
- else
- {asm mov dx,0
- asm mov ax,x3
- asm sub ax,x2
- asm mov ah,al
- asm mov al,0
- asm mov bx,y3
- asm sub bx,y2
- asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
- asm mov slope3,ax
- asm mov aux,ax
- asm mov byte ptr sign3,0 /*line3 has positive slope*/
- asm mov byte ptr auxSign,0
- }
-
- /*assign first and second*/
- if (sign1)
- {/*line1 is negative*/
- if (sign2)
- {/*both lines are negative*/
- if (slope1>slope2)
- {first=slope1; firstSign=sign1; last=slope2; lastSign=sign2; bend=2;}
- else
- {first=slope2; firstSign=sign2; last=slope1; lastSign=sign1; bend=1;}
- }
- else
- {/*line1 is negative, but line2 is positive*/
- first=slope1; firstSign=sign1; bend=2;
- last=slope2; lastSign=sign2;
- }
- }
- else
- {/*line1 is positive*/
- if (sign2)
- {/*line1 is positive, but line2 is negative*/
- first=slope2; firstSign=sign2; bend=1;
- last=slope1; lastSign=sign1;
- }
- else
- {/*both lines are positive*/
- if (slope1>slope2)
- {bend=1; first=slope2; firstSign=sign2; last=slope1; lastSign=sign1;}
- else
- {bend=2; first=slope1; firstSign=sign1; last=slope2; lastSign=sign2;}
- }
- }
-
- bendCheck=y3-y2+1;
- x2=320*y2+x2;
-
- /*draw the triangle (finnaly)*/
-
- /*; bx=screenpos of first line
- ; si=screenpos of last line
- ; dh=bx remainder
- ; dl=si remainder
- ; al=color*/
- asm push es
- asm push si
- asm push di
- asm mov ax,0a000h
- asm mov es,ax /*;point es to screen*/
- asm mov ax,y1
- asm mov bx,320
- asm mul bx
- asm add ax,x1
- asm mov bx,ax /*;bx=screen pos of first line*/
- asm mov si,ax /*;si=screen pos of second line (they both start at point1)*/
- asm mov cx,y3
- asm sub cx,y1 /*;cx=height of triangle*/
- asm mov al,c /*;color*/
- asm mov ah,c
- asm mov dx,0
-
- asm cmp byte ptr firstSign,1
- asm je l1out
- asm cmp byte ptr lastSign,1
- asm je l2out
- asm jmp pospos
- l2out:
- asm jmp negpos
- l1out:
- asm cmp byte ptr lastSign,1
- asm je l3out
- asm jmp negpos
- l3out:
- asm jmp negneg
- /*;shouldn't get here*/
-
- /*; neg-pos*/
- negpos:
- asm push cx
- asm mov cx,si
- asm sub cx,bx
- asm mov di,bx
- asm test di,01
- asm je l1np
- asm stosb
- asm dec cx
- l1np:
- asm cmp cx,0
- asm jl l9np
- asm shr cx,1
- asm jc l2np
- asm rep stosw
- asm jmp l9np
- l2np:
- asm rep stosw
- asm stosb /*;flags still preserved from shr cx,1*/
- l9np:
-
- asm add bx,320
- asm sub dh,first
- asm sbb bx,[first+1]
- asm add si,320
- asm add dl,last
- asm adc si,[last+1]
-
- asm pop cx
- asm cmp cx,bendCheck
- asm je l1npo
- negPosEntry:
- asm loop negpos /*;yloop*/
- asm jmp outaHere
- l1npo:
- asm jmp switchdirs
-
- /*; pos-neg*/
- posneg:
- asm push cx
- asm mov cx,si
- asm sub cx,bx
- asm mov di,bx
- asm test di,01
- asm je l1pn
- asm stosb
- asm dec cx
- l1pn:
- asm cmp cx,0
- asm jl l9pn
- asm shr cx,1
- asm jc l2pn
- asm rep stosw
- asm jmp l9pn
- l2pn:
- asm rep stosw
- asm stosb /*;flags still preserved from shr cx,1*/
- l9pn:
-
-
- asm add bx,320
- asm add dh,first
- asm adc bx,[first+1]
- asm add si,320
- asm sub dl,last
- asm sbb si,[last+1]
-
- asm pop cx
- asm cmp cx,bendCheck
- asm je l1pno
- posnegEntry:
- asm loop posneg /*;yloop*/
- asm jmp outaHere
- l1pno:
- asm jmp switchdirs
-
- /*; neg-neg*/
- negneg:
- asm push cx
- asm mov cx,si
- asm sub cx,bx
- asm mov di,bx
- asm test di,01
- asm je l1nn
- asm stosb
- asm dec cx
- l1nn:
- asm cmp cx,0
- asm jl l9nn
- asm shr cx,1
- asm jc l2nn
- asm rep stosw
- asm jmp l9nn
- l2nn:
- asm rep stosw
- asm stosb /*;flags still preserved from shr cx,1*/
- l9nn:
-
-
- asm add bx,320
- asm sub dh,first
- asm sbb bx,[first+1]
- asm add si,320
- asm sub dl,last
- asm sbb si,[last+1]
-
- asm pop cx
- asm cmp cx,bendCheck
- asm je l1nno
- negnegEntry:
- asm loop negneg /*;yloop*/
- asm jmp outaHere
- l1nno:
- asm jmp switchdirs
-
- /*; pos-pos*/
- pospos:
- asm push cx
- asm mov cx,si
- asm sub cx,bx
- asm mov di,bx
- asm test di,01
- asm je l1pp
- asm stosb
- asm dec cx
- l1pp:
- asm cmp cx,0
- asm jl l9pp
- asm shr cx,1
- asm jc l2pp
- asm rep stosw
- asm jmp l9pp
- l2pp:
- asm rep stosw
- asm stosb /*;flags still preserved from shr cx,1*/
- l9pp:
-
- asm add bx,320
- asm add dh,first
- asm adc bx,[first+1]
- asm add si,320
- asm add dl,last
- asm adc si,[last+1]
-
- asm pop cx
- asm cmp cx,bendCheck
- asm je switchdirs
- posposEntry:
- asm loop pospos /*;yloop*/
- asm jmp outaHere
-
- switchdirs:
- asm push ax
- asm cmp byte ptr bend,2 /*;compare x pos of first with xpos of auxiliary*/
- asm je l9sw
- /*;first needs to bend*/
- asm mov y2,si
- asm mov bx,x2
- asm mov ax,aux
- asm mov first,ax
- asm mov ah,auxSign
- asm mov firstSign,ah
- asm jmp l8sw
- l9sw:
- /*;last needs to bend*/
- asm mov si,x2
- asm mov ax,aux
- asm mov last,ax
- asm mov ah,auxSign
- asm mov lastSign,ah
- l8sw:
- asm pop ax
- asm cmp byte ptr firstSign,1
- asm je l1sw
- asm cmp byte ptr lastSign,1
- asm je l2sw
- asm jmp posposEntry
- l2sw:
- asm jmp posnegEntry
- l1sw:
- asm cmp byte ptr lastSign,1
- asm je l3sw
- asm jmp posnegEntry
- l3sw:
- asm jmp negnegEntry
- /*;shouldn't get here*/
-
- outaHere:
- asm pop di
- asm pop si
- asm pop es
- }